/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.jomijushi.fid.dao;

import java.util.List;
import javax.persistence.EntityManager;

/**
 *
 * @author Jorge Valverde Rebaza
 */
public interface DAO<K, E> {
      EntityManager getEntityManager();
      void setEntityManager(EntityManager entityManager);
      void setEntityClass(Class<E> e);
      void merge(E entity);
      void persist(E entity);
      void remove(E entity);
      E findById(K id);
      E findById(Class<E> e,K id);
      
    /**
     * Busqueda de un elemento por un parametro determinado
     * @param keyword  criterio de busqueda. Debe pertenecer como elemento de la entidad
     * @param valorKey valor que deberia tener el criterio de busqueda. Para este caso
     * serà del tipo generico, es decir, la busqueda se realizara por cualquier campo de la tabla
     * @return devuelve un elemento entidad que se buscaba. De no encontrarse devuelve null
     */
     E buscar(String keyword, Object valorKey);



    /**
     * Busqueda de un elemento exclusivo de una entidad hija por un parametro determinado
     * @param nombreHijo nombre de la clase hijo de la cual se desea trabajar
     * @param keyword  criterio de busqueda. Debe pertenecer como elemento exclusivo de la clase hijo
     * @param valorKey valor que deberia tener el criterio de busqueda. Para este caso
     * serà del tipo generico, es decir, la busqueda se realizara por cualquier campo de la tabla
     * @return devuelve un elemento entidad que se buscaba. De no encontrarse devuelve null
     */
     E buscar(String nombreHijo, String keyword, Object valorKey);


     /**
      * Reportar una lista de elementos cumpliendo ciertos criterios
      * @param keyword criterio de busqueda. Nombre de la columna con la que se realizara la consulta. Debe ser comun entre la clase padre y el hijo
      * @param valorKey valor que debe tener el criterio de busqueda
      * @param ordenarBy nombre de la columna por la cual se debe realizar el ordenamiento de la lista a generar
      * @param criterioOrden criterio de orden, ascendente="asc" o descendente="desc"
      * @param verTodo criterio de reporte total o parcial, true = total, false = parcial
      * @param isLike criterio de comparacion, true = usar like, false = no usar like
      * @param limInf si el reporte es parcial, indica el limite inferior del reporte de paginacion
      * @param limSup si el reporte es parcial, indica el limite superior del reporte de paginacion
      * @return Lista de elementos que cumnplen los criterios especificados. En caso contrario devuelve lista vacia
      */
     List<E> reportar(String keyword, Object valorKey,String ordenarBy, String criterioOrden, boolean verTodo, boolean isLike, int limInf, int limSup);


  /**
      * Reportar una lista de elementos cumpliendo ciertos criterios
      * @param nombreHijo nombre de la clase hijo de la cual se desea trabajar
      * @param keyword criterio de busqueda. Nombre de la columna con la que se realizara la consulta. Debe ser comun entre la clase padre y el hijo
      * @param valorKey valor que debe tener el criterio de busqueda
      * @param ordenarBy nombre de la columna por la cual se debe realizar el ordenamiento de la lista a generar
      * @param criterioOrden criterio de orden, ascendente="asc" o descendente="desc"
      * @param verTodo criterio de reporte total o parcial, true = total, false = parcial
      * @param isLike criterio de comparacion, true = usar like, false = no usar like
      * @param limInf si el reporte es parcial, indica el limite inferior del reporte de paginacion
      * @param limSup si el reporte es parcial, indica el limite superior del reporte de paginacion
      * @return Lista de elementos que cumnplen los criterios especificados. En caso contrario devuelve lista vacia
      */
     List<E> reportar(String nombreHijo, String keyword, Object valorKey,String ordenarBy, String criterioOrden, boolean verTodo, boolean isLike, int limInf, int limSup);

}
